home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / graphics / mandlbx1.arc / WINDOW.C < prev   
C/C++ Source or Header  |  1985-11-20  |  17KB  |  600 lines

  1. /* window.c
  2.  *   Main loop manages GEM windows, AES, mouse, menues, and drawing process.
  3.  */
  4. #include <obdefs.h>
  5. #include <define.h>
  6. #include <gemdefs.h>
  7. #include <vdibind.h>
  8. #include <osbind.h>
  9. #include <stdio.h>
  10. #include <debug.h>
  11. #include "\t\mandlbox.h"
  12.  
  13. /*#define WI_KIND        (SIZER|MOVER|FULLER| CLOSER|NAME|VSLIDE)*/
  14. #define WI_KIND        (CLOSER|NAME|VSLIDE)
  15.  
  16. #define MIN_WIDTH  (2*gl_wbox)
  17. #define MIN_HEIGHT (3*gl_hbox)
  18. int gl_hchar, gl_wchar, gl_wbox, gl_hbox;    /* system sizes */
  19.  
  20. int    ps_handle;    /* physical screen (workstation) handle */
  21. int    vs_handle;    /* virtual screen (workstation) handle */
  22. int    wi_handle;    /* window handle */
  23. int    old_res;    /* initial resolution of screen */
  24.  
  25. int    xdesk,ydesk,hdesk,wdesk;    /* size of whole desktop */
  26. int    xwork,ywork,hwork,wwork;    /* size of current working window */
  27. int    xold,yold,hold,wold;        /* size of screen before FULL cmd */
  28.  
  29. int    msgbuff[8];    /* event message buffer */
  30. int    keycode;    /* keycode returned by event-keyboard */
  31. int    mx,my;        /* mouse x and y pos. */
  32. int    butdown;    /* button state tested for, UP/DOWN */
  33. int    ret;        /* dummy return variable */
  34. int    clut_rotate;    /* mode */
  35.  
  36. /******* shared memory with draw.c: */
  37. double    Vx0, Vy0, Vxw, Vyw;    /* Size of viewed area, in real numbers */
  38. int Niter;            /* max number of iterations */
  39. int box_invisible;
  40.  
  41. /******* shared memory with stitch.c: */
  42. int no_check = 1;
  43.  
  44. int    contrl[12], intin[128], ptsin[128], intout[128];
  45. int    ptsout[128];    /* storage wasted for idiotic bindings */
  46.  
  47. char str[128];
  48.  
  49. GRECT work_clip;
  50. int draw_state;
  51. char *p_menu;
  52.  
  53. #define c(x) 1000*(2*(x)+1)/16
  54. int desks_clut[16][3], mandel_clut[16][3] = 
  55. {    {c(7),c(7),c(7)},    /* white */
  56.     {c(0),c(0),c(0)},    /* black */
  57.     {c(7),c(1),c(1)},    /* red */
  58.     {c(7),c(4),c(0)},
  59.     {c(7),c(6),c(0)},
  60.     {c(7),c(7),c(0)},    /* yellow */
  61.     {c(6),c(7),c(0)},
  62.     {c(0),c(7),c(0)},    /* green */
  63.     {c(0),c(7),c(5)},
  64.     {c(0),c(7),c(6)},    /* blue */
  65.     {c(0),c(6),c(7)},
  66.     {c(2),c(3),c(7)},
  67.     {c(4),c(0),c(7)},
  68.     {c(6),c(0),c(7)},    /* violet */
  69.     {c(7),c(0),c(6)},
  70.     {c(7),c(0),c(4)}
  71. };
  72.  
  73. struct places
  74. {    double x, y, dx, dy;
  75.     int menue_number;
  76.     int iter_ct;
  77.     char name[20];
  78. } places[] = 
  79.     {{.651350,-.176159, .000929, .000636, MGOLUM,  1024, "Golum"},
  80.      {.166765,-.807549, .018935, .012964, MRIPPLE, 1024, "Ripple"},
  81.      {.054566,-.755330, .002208, .001512, MPINWH,  1024, "Pinwheels"},
  82.      {.127512,-.781265, .011749, .008044, MSWIRLS, 1024, "Swirls"},
  83.      {.656728,-.174796, .004559, .003122, M3ON4,   1024, "3 on 4"},
  84.      {.650663,-.176422, .001890, .001249, MTURTLE, 1024, "Turtle"},
  85.      {-1.0,  -1.85,    2.0,     2.4,      MBUDDAH,  256, "Buddah"}};
  86.  
  87. struct
  88. {    char active, on_crt;
  89.     int hidden;
  90.     int want_active;
  91.     char new0, new1;
  92.     int x0,y0, x1,y1;
  93.     int xyarray[10];
  94. }  rbox = {0, 1, FALSE, 0};
  95.  
  96. char *fs_get();
  97.  
  98. main()
  99. {    int event, mouse_buttons, mmoving, fulled;
  100.     int x0, y0, xw, yw, i, j;
  101.     int *p_val;
  102. /*    if ((old_res=Getrez()) != 0)    /* won't work with AES */
  103. /*        Setscreen(-1, -1, 0);    /* make low resolution */
  104.     appl_init();
  105.     open_vwork();
  106.      open_window();
  107.     open_rsc();
  108.     Niter = 256;    /* inz count till black */
  109.     inz_dialog();
  110.  
  111.     graf_mouse(ARROW,0x0L);
  112.     fulled=FALSE;
  113.     butdown=TRUE;
  114.     box_invisible = 1;
  115.  
  116.     dr_iRastWindow(xwork, ywork, wwork, hwork);
  117.     dr_iProgCoords(-1.0,-1.85, 2.0,2.4);
  118.     dr_Vreset();
  119.     do 
  120.     {    if (draw_state==0 || mmoving)
  121.         {    event = evnt_multi(
  122.                 MU_MESAG| MU_BUTTON| MU_KEYBD | MU_TIMER,
  123.                 1,1,butdown,
  124.                 0,0,0,0,0,  0,0,0,0,0,
  125.                 msgbuff,100,0,    /* 100 ms timer*/
  126.                 &mx,&my,&mouse_buttons,&ret,&keycode,&ret);
  127.         }else
  128.         {    event = evnt_multi(MU_MESAG| MU_BUTTON| MU_KEYBD| MU_M1,
  129.                 1,1,butdown,
  130.                 1,0,0,0,0,     /* (always true event) */
  131.                 0,0,0,0,0,  msgbuff,0,0,
  132.                 &mx,&my,&mouse_buttons,&ret,&keycode,&ret);
  133.         }
  134.         if (event & MU_MESAG) switch (msgbuff[0])
  135.         {   case WM_REDRAW:    /* set clip and draw_mode */
  136.             start_redraw(1, msgbuff[4],msgbuff[5],msgbuff[6],
  137.                 msgbuff[7]);        /*!!!*/
  138.             break;
  139.             case WM_NEWTOP:  /* unsure of what this does, so boobytrap*/
  140.             case WM_TOPPED:
  141.             wind_set(wi_handle,WF_TOP,0,0,0,0);
  142.             break;
  143.             case WM_SIZED:
  144.             case WM_MOVED:
  145.             if (msgbuff[6]<MIN_WIDTH) msgbuff[6] = MIN_WIDTH;
  146.             if (msgbuff[7]<MIN_HEIGHT) msgbuff[7] = MIN_HEIGHT;
  147.             wind_set(wi_handle,WF_CURRXYWH,
  148.                 msgbuff[4],msgbuff[5],msgbuff[6],msgbuff[7]);
  149.             wind_get(wi_handle,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork);
  150.             dr_iRastWind(xwork,ywork, wwork,hwork);
  151.             start_redraw(-1, xwork, ywork, wwork, hwork);
  152.             break;
  153.             case WM_FULLED:
  154.             if(fulled == 0)        /* to full: */
  155.             {    wind_calc(WC_BORDER,WI_KIND,xwork,ywork,wwork,
  156.                     hwork, &xold,&yold,&wold,&hold);
  157.                 wind_calc(WC_WORK,WI_KIND,xdesk,ydesk,wdesk,
  158.                     hdesk,&xwork,&ywork,&wwork,&hwork);
  159.                 wind_set(wi_handle,WF_CURRXYWH,xdesk,ydesk,
  160.                     wdesk,hdesk);
  161.             }else            /* to un-full: */
  162.             {    wind_calc(WC_WORK,WI_KIND,xold,yold,wold,hold,
  163.                     &xwork,&ywork,&wwork,&hwork);
  164.                 wind_set(wi_handle,WF_CURRXYWH,xold,yold,
  165.                     wold,hold);
  166.             }
  167.             fulled ^= TRUE;
  168.             dr_iRasterWindow(xwork, ywork, wwork, hwork);
  169.             start_redraw(-1, xwork, ywork, wwork, hwork);
  170.             break;
  171.             case MN_SELECTED:
  172.             switch (msgbuff[4])
  173.             {   
  174.                 case MSAVEAS:
  175.                 write_scr(fs_get("man"));
  176.                 break;
  177.                 case MOPEN:
  178.                 read_scr(fs_get("man"));
  179.                 draw_state = 0;
  180.                 break;
  181.                 case MCROTATE:
  182.                 clut_rotate = 1-clut_rotate;
  183.                 break;
  184.                 case MQUIT:
  185.                 goto quit;
  186.  
  187.                 case MBUDDAH:   case MRIPPLE:   case MPINWH:
  188.                 case MSWIRLS:   case M3ON4:        case MTURTLE:
  189.                 case MGOLUM:
  190.  
  191.                 for (i=0;places[i].menue_number!=msgbuff[4];i++)
  192.                     if(places[i].menue_number ==0) break;
  193.                 dr_iProgCoords(places[i].x,  places[i].y,
  194.                          places[i].dx, places[i].dy);
  195.                 start_redraw(1, xwork, ywork, wwork, hwork);
  196.                 dr_Vreset();
  197.                 Niter = places[i].iter_ct;
  198.                 break;
  199.                 case MZOUT4:
  200.                 dr_zoom(xwork-wwork*3/2, ywork-hwork*3/2,
  201.                       xwork+wwork*5/2, ywork+hwork*5/2);
  202.                 start_redraw(1, -1, 0, 0, 0);
  203.                 break;
  204.                 case MZNUMBER:
  205.                 zoom_numerically();
  206.                 break;
  207.                 case MQPAINT:    /* patch-up area */
  208.                 printf("\nmqpaint\n");
  209.                 while (1 + (mouse_buttons & 3))
  210.                 {    fprintf(stderr,"*******");
  211.                     dr_area(mx, my, 3);
  212.                     dr_putBuf( 7*7 );
  213.                     fprintf(stderr,"!!!!!!!!\n");
  214.                     event = evnt_multi(MU_MESAG| MU_BUTTON| 
  215.                         MU_KEYBD| MU_M1,
  216.                         1,1,butdown,
  217.                         1,0,0,0,0, /* always true */
  218.                         0,0,0,0,0,  msgbuff,0,0,
  219.                         &mx,&my,&mouse_buttons,&ret,
  220.                         &keycode,&ret);
  221.                 }
  222.                 case ABOUTMAN:
  223.                 disp_dialog(AUTHOR, 0);
  224.                 break;
  225.                 case MUNZOOM:
  226.                 if (dr_Vpop())
  227.                     start_redraw(1, -1,0,0,0,0);
  228.                 break;
  229.                 case CBOXES:
  230.                 box_invisible = 1-box_invisible;
  231.                 break;
  232.                 case MAITER:
  233.                 set_iteration();
  234.                 break;
  235.                 case MSAVENXT:
  236.                 case MPLAYMOV:
  237.                 case MZHELP:
  238.                 case MZROTATE:
  239.                 case MAZ2:
  240.                 default:
  241.                 form_alert(0,"[1][Detour:|Function Under \
  242. Construction!|Try again next Rev.|(Remember, it's Freeware)][Acknowlege]");
  243.                 break;
  244.             }
  245.             menu_tnormal(p_menu, msgbuff[3], TRUE);
  246.             break;            
  247.         }
  248.         if (event & MU_KEYBD) 
  249.         {    keycode &= 0xff;
  250.             switch (keycode)
  251.             {   case 'D': debug_print = 1-debug_print; break;
  252.                 case 'C': no_check = 1-no_check; break;
  253.         }    }
  254.  
  255.         if ((event & MU_BUTTON) /*&&(wi_handle == top_window) ???*/)
  256.             butdown ^= 1;
  257.         if (draw_state == 0) mouse_buttons = butdown ^ 1;
  258.         if (mouse_moving(mx, my, mouse_buttons))
  259.             mmoving = 10;
  260.         if (mmoving)
  261.         {    draw_on_screen();    /* make boxes visible */
  262.             view_screen();
  263.             mmoving--;
  264.         }else
  265.             more_redraw();        
  266.  
  267.         if (clut_rotate)
  268.             rotate_clut(vs_handle,mandel_clut);
  269.     } while(!((event & MU_MESAG) && (msgbuff[0] == WM_CLOSED)));
  270. quit:
  271.     menu_bar(p_menu, FALSE);
  272.     load_clut(vs_handle, desks_clut, (long)0);
  273.     wind_close(wi_handle);
  274.     graf_shrinkbox(xwork+wwork/2,ywork+hwork/2,gl_wbox,gl_hbox,xwork,ywork,wwork,hwork);
  275.     wind_delete(wi_handle);
  276.     v_clsvwk(vs_handle);
  277.     appl_exit();
  278. /*    if (old_res != 0)        /*won't work with AES 
  279. /*        Setscreen(-1, -1, old_res);    /* restore resolution */
  280. }
  281.  
  282. zoom_numerical